/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.aplicacao;

import com.sistema.db.Banco;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import org.jdesktop.swingx.JXDatePicker;
import org.jfree.chart.ChartPanel;

/**
 *
 * @author gr
 */
public class DialogAdminAnalises extends JFrame
{

    private JPanel pnlFiltro;
    private JPanel pnlBtn;
    private ChartPanel pnlGrafico;
    private JComboBox comboSelecao;
    private JComboBox comboTipoLigacao;
    private JComboBox comboAnalise;
    private JComboBox comboEntidades;
    private JXDatePicker dt_inicio;
    private JXDatePicker dt_fim;
    private JButton btnAtualizar;
    private JButton btnLimpar;
    private JLabel lblEntidade;
    private List<ComboAnalise> listEntidades = new ArrayList<ComboAnalise>();


    public DialogAdminAnalises()
    {
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        setTitle( "Controle de Ligações Suporte" );
        setSize( 800, 700 );
        setLocationRelativeTo( null );
        iniciaComponentes();
        actions();
        setVisible( true );
    }

    public void iniciaComponentes()
    {

        pnlFiltro = new JPanel();
        pnlFiltro.setLayout( new GridBagLayout() );
        pnlFiltro.setBorder( BorderFactory.createEtchedBorder( EtchedBorder.LOWERED ) );

        //Adiciona campo data inicio

        pnlFiltro.add( new JLabel( "Data Inicio:" ), new GridBagConstraints( 0, 0, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 15, 5, 5, 5 ), 0, 0 ) );


        dt_inicio = new JXDatePicker( new Date() );
        pnlFiltro.add( dt_inicio, new GridBagConstraints( 1, 0, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 15, 5, 5, 5 ), 0, 0 ) );

        //Adiciona campo data fim

        pnlFiltro.add( new JLabel( "Data Fim:" ), new GridBagConstraints( 2, 0, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 15, 5, 5, 5 ), 0, 0 ) );

        dt_fim = new JXDatePicker( new Date() );
        pnlFiltro.add( dt_fim, new GridBagConstraints( 3, 0, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 15, 5, 5, 5 ), 0, 0 ) );


        //Combo Gráfico

        pnlFiltro.add( new JLabel( "Análise: " ), new GridBagConstraints( 0, 1, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        comboAnalise = new JComboBox();
        comboAnalise.addItem( "Acumulada" );
        comboAnalise.addItem( "Comparativa" );
        pnlFiltro.add( comboAnalise, new GridBagConstraints( 1, 1, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        //Combo tipo Ligacao

        pnlFiltro.add( new JLabel( "Tipo: " ), new GridBagConstraints( 2, 1, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        comboTipoLigacao = new JComboBox();
        comboTipoLigacao.addItem( "Total de Ligações" );
        comboTipoLigacao.addItem( "Ligações Recebidas" );
        comboTipoLigacao.addItem( "Ligações Realizadas" );
        pnlFiltro.add( comboTipoLigacao, new GridBagConstraints( 3, 1, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        //Combo seleção

        pnlFiltro.add( new JLabel( "Seleção: " ), new GridBagConstraints( 0, 2, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        comboSelecao = new JComboBox();
        comboSelecao.addItem( "Clientes" );
        comboSelecao.addItem( "Usuários" );
        pnlFiltro.add( comboSelecao, new GridBagConstraints( 1, 2, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );


        //Combo entidade

        lblEntidade = new JLabel( "Entidade: " );
        lblEntidade.setEnabled( false );
        pnlFiltro.add( lblEntidade, new GridBagConstraints( 2, 2, 1, 1, 0.1, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        comboEntidades = new JComboBox();
        comboEntidades.setEnabled( false );
        comboEntidades.addItem( "Todos" );

        listEntidades.add(new ComboAnalise( 0, "Todos" ) );

        pnlFiltro.add( comboEntidades, new GridBagConstraints( 3, 2, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );



        //Botões

        pnlBtn = new JPanel( new GridBagLayout() );

        btnAtualizar = new JButton( "Atualizar" );
        btnAtualizar.setPreferredSize( new Dimension( 150, 30 ) );
        ImageIcon img_atualizar = new ImageIcon( getClass().getResource( "/img/img_atualiza.png" ) );
        btnAtualizar.setIcon( img_atualizar );

        pnlBtn.add( btnAtualizar, new GridBagConstraints( 0, 1, 1, 1, 0.5, 0.5,
                GridBagConstraints.EAST, GridBagConstraints.EAST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        btnLimpar = new JButton( "Padrão" );
        btnLimpar.setPreferredSize( new Dimension( 150, 30 ) );
        ImageIcon img_limpar = new ImageIcon( getClass().getResource( "/img/img_limpar.png" ) );
        btnLimpar.setIcon( img_limpar );

        pnlBtn.add( btnLimpar, new GridBagConstraints( 1, 1, 1, 1, 0.5, 0.5,
                GridBagConstraints.WEST, GridBagConstraints.WEST,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );

        pnlFiltro.add( pnlBtn, new GridBagConstraints( 0, 3, 4, 1, 0.5, 0.5,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets( 5, 5, 5, 5 ), 0, 0 ) );


        //Grafico

        pnlGrafico = new ChartPanel( null );
        atualizaGrafico();


        //Adiciona os paineis

        setLayout( new GridBagLayout() );

        add( pnlFiltro, new GridBagConstraints( 0, 0, 1, 1, 0.5, 0.5,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets( 15, 30, 30, 30 ), 200, 0 ) );

        add( pnlGrafico, new GridBagConstraints( 0, 1, 1, 1, 20.5, 20.5,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets( 5, 30, 30, 30 ), 0, 0 ) );



    }

    public void atualizaGrafico()
    {

        String consulta = "";
        String titulo = "";
        String campos = "";
        String valores = "";
        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );
        String dtInicio = "";
        String dtFim = "";


        //Busca Datas
        try
        {
            dtInicio = sdf.format( dt_inicio.getDate() );
        } catch ( Exception e )
        {
            dtInicio = "";
        }


        try
        {

            dtFim = sdf.format( dt_fim.getDate() );

        } catch ( Exception e )
        {
            dtFim = "";
        }


        //Combo Seleção

        if ( comboSelecao.getSelectedItem().toString().equalsIgnoreCase( "Clientes" ) )
        {
            titulo = "Clientes - ";

            if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Acumulada" ) )
            {

                campos = "cliente";

                consulta = "SELECT a.descricao as cliente, "
                        + "sum(b.lig_recebida) as lig_recebida, "
                        + "sum(b.lig_realizada) as lig_realizada, "
                        + "sum(b.lig_recebida) + sum(b.lig_realizada) as total "
                        + "FROM clientes a "
                        + "INNER JOIN ligacoes b "
                        + "ON (a.id = b.ref_cliente) WHERE 1=1 ";


                if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( dtFim.equalsIgnoreCase( "" ) ) )
                {
                    consulta += "AND data >= '" + dtInicio + "' ";
                } else if ( ( dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += "AND data <= '" + dtFim + "' ";
                } else if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += "AND data BETWEEN '" + dtInicio + "' AND '" + dtFim + "' ";
                }


                consulta += "GROUP BY a.descricao";


            } else if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Comparativa" ) )
            {

                campos = "data";


                consulta = "SELECT date_format(data, '%m/%Y') as data, "
                        + "date_format(data, '%Y') as ano, "
                        + "sum(lig_recebida) as lig_recebida, "
                        + "sum(lig_realizada) as lig_realizada, "
                        + "sum(lig_recebida) + sum(lig_realizada) as total "
                        + "FROM ligacoes "
                        + "WHERE 1=1 ";


                if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( dtFim.equalsIgnoreCase( "" ) ) )
                {
                    consulta += "AND data >= '" + dtInicio + "' ";
                } else if ( ( dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += "AND data <= '" + dtFim + "' ";
                } else if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += "AND data BETWEEN '" + dtInicio + "' AND '" + dtFim + "' ";
                }

                if ( !comboEntidades.getSelectedItem().toString().equalsIgnoreCase( "Todos" ) )
                {
                    consulta += "AND ref_cliente =  " + listEntidades.get( comboEntidades.getSelectedIndex() ).getId() + " ";
                }


                consulta += " GROUP BY date_format(data, '%m/%Y') ORDER BY ano,data";

            }

        } else if ( comboSelecao.getSelectedItem().toString().equalsIgnoreCase( "Usuários" ) )
        {

            titulo = "Usuários - ";


            if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Acumulada" ) )
            {

                campos = "usuario";

                consulta = "SELECT a.nome as usuario, "
                        + "sum(b.lig_recebida) as lig_recebida, "
                        + "sum(b.lig_realizada) as lig_realizada, "
                        + "sum(b.lig_recebida) + sum(b.lig_realizada) as total "
                        + "FROM usuarios a "
                        + "INNER JOIN ligacoes b "
                        + "ON (a.id = b.ref_usuario) ";


                if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( dtFim.equalsIgnoreCase( "" ) ) )
                {
                    consulta += " AND data >= '" + dtInicio + "' ";
                } else if ( ( dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += " AND data <= '" + dtFim + "' ";
                } else if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += " AND data BETWEEN '" + dtInicio + "' AND '" + dtFim + "' ";
                }


                consulta += "GROUP BY a.nome";

            } else if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Comparativa" ) )
            {

                campos = "data";

                consulta = "SELECT date_format(data, '%m/%Y') as data, "
                        + "date_format(data, '%Y') as ano, "
                        + "sum(lig_recebida) as lig_recebida, "
                        + "sum(lig_realizada) as lig_realizada, "
                        + "sum(lig_recebida) + sum(lig_realizada) as total "
                        + "FROM ligacoes "
                        + "WHERE 1=1 ";


                if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( dtFim.equalsIgnoreCase( "" ) ) )
                {
                    consulta += " AND data >= '" + dtInicio + "' ";
                } else if ( ( dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += " AND data <= '" + dtFim + "' ";
                } else if ( ( !dtInicio.equalsIgnoreCase( "" ) ) && ( ( !dtFim.equalsIgnoreCase( "" ) ) ) )
                {
                    consulta += " AND data BETWEEN '" + dtInicio + "' AND '" + dtFim + "' ";
                }

                if ( !comboEntidades.getSelectedItem().toString().equalsIgnoreCase( "Todos" ) )
                {
                    consulta += "AND ref_usuario =  " + listEntidades.get( comboEntidades.getSelectedIndex() ).getId() + " ";
                }

                consulta += " GROUP BY date_format(data, '%m/%Y') ORDER BY ano,data ";

            }

        }


        //Combo Tipo de ligação

        if ( comboTipoLigacao.getSelectedItem().toString().equalsIgnoreCase( "Total de Ligações" ) )
        {
            titulo += "Total de Ligações";
            valores = "total";
        } else if ( comboTipoLigacao.getSelectedItem().toString().equalsIgnoreCase( "Ligações Recebidas" ) )
        {
            titulo += "Ligações Recebidas";
            valores = "lig_recebida";
        } else if ( comboTipoLigacao.getSelectedItem().toString().equalsIgnoreCase( "Ligações Realizadas" ) )
        {
            titulo += "Ligações Realizadas";
            valores = "lig_realizada";
        }


        //Combo tipo grafico

        Banco conn = new Banco();
        ResultSet rs = conn.executarConsulta( consulta );
        conn.fecha();

        List<String> entidades = new ArrayList<String>();
        List<Integer> resultados = new ArrayList<Integer>();


        try
        {
            while ( rs.next() )
            {
                if( rs.getInt( valores ) != 0 )
                {
                    entidades.add( rs.getString( campos ) );
                    resultados.add( rs.getInt( valores ) );
                }                
            }

        } catch ( Exception e )
        {
            e.printStackTrace();
        }


        if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Acumulada" ) )
        {

            //Cria grafico pizza
            pnlGrafico.setChart( Graficos.graficoPizza( titulo, resultados, entidades ) );

        } else
        {

            //Cria grafico Coluna
            pnlGrafico.setChart( Graficos.graficoColuna( titulo, resultados, entidades ) );

        }


    }



    //Actions
    void actions()
    {
        btnAtualizar.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
               atualizaGrafico();
            }
        } );

        btnLimpar.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
                dt_inicio.setDate( new Date() );
                dt_fim.setDate( new Date() );
                comboAnalise.setSelectedItem( "Acumulada" );
                comboSelecao.setSelectedItem( "Clientes" );
                comboTipoLigacao.setSelectedItem( "Total de Ligações" );

                atualizaGrafico();

            }
        } );


        comboAnalise.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
                atualizaComboEntidades();
                atualizaGrafico();
            }
        } );

        comboSelecao.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
                atualizaComboEntidades();
                atualizaGrafico();
            }
        } );

        comboTipoLigacao.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e )
            {
                atualizaGrafico();
            }
        });

        comboEntidades.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e )
            {               
                atualizaGrafico();
            }
        });

        dt_inicio.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e )
            {
                atualizaGrafico();
            }
        });

        
        dt_fim.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e )
            {
                atualizaGrafico();
            }
        });

    }

    //Atualiza combo Entidades
    public void atualizaComboEntidades()
    {
        String sql = "";
        int tamanho = listEntidades.size();

        for(int x=1; x < tamanho; x++)
        {
            comboEntidades.removeItemAt( 1 );
            listEntidades.remove( 1 );
        }
        


        if ( comboAnalise.getSelectedItem().toString().equalsIgnoreCase( "Comparativa" ) )
        {
            if ( comboSelecao.getSelectedItem().toString().equalsIgnoreCase( "Clientes" ) )
            {
                sql = "SELECT id,descricao FROM clientes ORDER BY descricao";
            } else if ( comboSelecao.getSelectedItem().toString().equalsIgnoreCase( "Usuários" ) )
            {
                sql = "SELECT id,nome as descricao FROM usuarios ORDER BY descricao";
            }



            //Conecta ao banco e faz o select
            Banco conn = new Banco();
            ResultSet rs = conn.executarConsulta( sql );
            conn.fecha();

            try
            {
                while ( rs.next() )
                {
                    comboEntidades.addItem( new ComboAnalise( rs.getInt( "id" ), rs.getString( "descricao" ) ) );
                    listEntidades.add( new ComboAnalise( rs.getInt( "id" ), rs.getString( "descricao" ) ) );
                }

            } catch ( Exception f )
            {
                f.printStackTrace();
            }


            comboEntidades.setEnabled( true );
            lblEntidade.setEnabled( true );

        } else
        {
            comboEntidades.setEnabled( false );
            lblEntidade.setEnabled( false );
        }


    }

    public static void main( String args[] )
    {
        new DialogAdminAnalises();
    }
}
